perm filename O[G,BGB] blob sn#026246 filedate 1973-02-25 generic text, type T, neo UTF8
00100	SUBR(XSORT)S0-----------------------------------------------------
00200	BEGIN XSORT; SPLIT WINDOW W0 INTO TWO WINDOWS W1 AND W2.
00300	;BGB - 25 FEBRUARY 1973.
00400		;IF (XH-XL) ≤ 1.0 THEN RETURN.
00500		;DECLIP
00600		;IF NCNT ≤ EDGCNT THEN ESCAN & RETURN.
00700		; XMID ← (XL+XH)/2
00800	L1:	SETZB E,1↔EXCH E,(S0)↔JUMPE E,L2
00900		NVT V,E↔CAMLE XMID,XPP(V)↔IORI 1,1  ;NVT IN 0=W1 OR 1=W2.
01000		PVT V,E↔CAMLE XMID,XPP(V)↔IORI 1,2  ;PVT IN 0=W1 OR 2=W2.
01100		GO@[SIDE1↔.+1↔.+1↔SIDE2](1)
01200	
01300	;EDGE CROSSES MID LINE.
01400		LACN AA(E)↔FMP XMID		;YMID ← -(A*XMID+C)/B.
01500		FSB CC(E)↔FDV BB(E)		;MIDDLE CROSSING Y-LEVEL.
01600	
01700	;SKIP WHEN CROSSING IS ABOVE YL.
01800	;EXECUTE WHEN CROSSING IS BELOW WINDOW.
01900		CAMGE 0,YL↔GO[
02000			CAMGE 0,YPP(V)	;SKIP Y CROSSING ABOVE PVT.
02100	
02200			;CROSSING BELOW PVT, E IN PVT'S SIDE.
02300			GO@[SIDE1↔SIDE1↔SIDE2↔SIDE2](1)
02400	
02500			;CROSSING ABOVE PVT, E IN NVT'S SIDE.
02600			GO@[SIDE1↔SIDE2↔SIDE1↔SIDE2](1)
02700		]
02800	;SKIP WHEN CROSSING IS BELOW YH.
02900	;EXECUTE WHEN CROSSING IS ABOVE WINDOW.
03000		CAMLE 0,YH↔GO[
03100			CAMLE 0,YPP(V)	;SKIP Y CROSSING IS BELOW PVT.
03200	
03300			;CROSSING ABOVE PVT, E IN NVT'S SIDE.
03400			GO@[SIDE1↔SIDE2↔SIDE1↔SIDE2](1)
03500	
03600			;CROSSING BELOW PVT, E IN PVT'S SIDE.
03700			GO@[SIDE1↔SIDE1↔SIDE2↔SIDE2](1)
03800		]
03900	;EDGE IS IN BOTH SIDE1 AND SIDE2.
04000		DIP E,E↔DAC E,(S0)
04100		AOS S1↔AOJA S2,L2
04200	;EDGE IS ONLY IN ONE SIDE OR THE OTHER.
04300	SIDE1:	DIPZ E,(S0)↔AOJA S1,L2
04400	SIDE2:	DAPZ E,(S0)↔AOJA S2,L2
04500	L2:	AOBJN S0,L1
04600	
04700	;	DAC S2,-5(P)
04800	;	DAC XMID,-4(P)
04900		PUSH P,S1
05000		CALL(YSORT,XL,XMID,YL,YH)
05100		GO XSORT
05200	BEND
     

00100	;CLIP DETECTOR - MIDPOINT METHOD.
00200	
00300		CAML Y1,YH↔IORI C1,8	;NORTH.
00400		CAMG Y1,YL↔IORI C1,4	;SOUTH.
00500		CAML X1,XH↔IORI C1,2	;EAST.
00600		CAMG X1,XL↔IORI C1,1	;WEST.
00700		JUMPE C1,INSIDER
00800	
00900		CAML Y2,YH↔IORI C2,8	;NORTH.
01000		CAMG Y2,YL↔IORI C2,4	;SOUTH.
01100		CAML X2,XH↔IORI C2,2	;EAST.
01200		CAMG X2,XL↔IORI C2,1	;WEST.
01300		JUMPE C2,INSIDER
01400	
01500		TDNE C1,C2	;WHEN V1 & V2 ARE BEYOND THE WINDOW
01600		GO OUTSIDER	;IN THE SAME DIRECTION - EASY OUT.
01700	
01800	L:	LAC X,X1↔ADD X,X2↔ASH X,-1	;MIDPOINT.
01900		LAC Y,Y1↔ADD Y,Y2↔ASH Y,-1
02000	
02100		CAML Y0,YH↔IORI C0,8	;NORTH.
02200		CAMG Y0,YL↔IORI C0,4	;SOUTH.
02300		CAML X0,XH↔IORI C0,2	;EAST.
02400		CAMG X0,XL↔IORI C0,1	;WEST.
02500		JUMPE C0,INSIDER
02600	
02700		TDNE C0,C1
02800		GO .+5		;FIRST HALF EASY OUT.
02900		LAC C2,C0	;FIRST HALF STILL IN DOUBT.
03000		LAC X2,X0
03100		LAC Y2,Y0↔GO L
03200	
03300		TDNE C0,C2
03400		GO OUTSIDER	;BOTH HALVES EASY OUT.
03500		LAC C1,C0	;SECOND HALF STILL IN DOUBT.
03600		LAC X1,X0
03700		LAC Y1,Y0↔GO L